//***********************************************************************************************
//  RationalNumber.java   Author:Duanzhixuan
//  Represents one rational number with a numerator and denominator.
//**********************************************************************************************

public class RationalNumber
{
  private int numerator, denominator;
//----------------------------------------------------------------------------------------------
// Constructor: Sets up the rational number by ensuring a nonzero denominator and making only the numerator signed
//----------------------------------------------------------------------------------------------
public RationalNumber(int numer, int denom)
{
  if(denom == 0)
   denom =1;

//Make the numerator "store" the sign
if (denom<0)
{
  numer =numer*-1;
  denom = denom*-1;
}

numerator = numer;
denominator =denom;
reduce();
}
//---------------------------------------------------------------------------------------------
//  Returns the numerator of this rational number.
//---------------------------------------------------------------------------------------------
public int getNumerator()
{
 return numerator;
}
//----------------------------------------------------------------------------------------------
//  Returns the denominator of this rational number.
//---------------------------------------------------------------------------------------------
public int getDenominator()
{
  return denominator;
}

//---------------------------------------------------------------------------------------------
//Returns the reciprocal of this rational number.
//--------------------------------------------------------------------------------------------
public RationalNumber reciprocal()
{
   return new RationalNumber(denominator, numerator);
}
//----------------------------------------------------------------------------------------------------
// Adds this rational number to the one passed as a parameter. A common denominator is found by multiplying the individual denominators.
//---------------------------------------------------------------------------------------------------
public RationalNumber add(RationalNumber op2)
{
    int commonDenominator = denominator*op2.getDenominator();
    int numerator1 = numerator* op2.getDenominator();
    int numerator2 = op2.getNumerator()*denominator;
    int sum = numerator1 + numerator2;

    return new RationalNumber(sum , commonDenominator);
}

//----------------------------------------------------------------------------------------------------
// Subtracts the rational number passed as a parameter from this rational number.
//----------------------------------------------------------------------------------------------------
public RationalNumber subtract(RationalNumber op2)
{
  int commonDenominator = denominator*op2.getDenominator();
  int numerator1 = numerator*op2.getDenominator();
  int numerator2 = op2.getNumerator()*denominator;
  int defference =numerator1- numerator2;

return new RationalNumber(defference, commonDenominator);
}
//-----------------------------------------------------------------------------------------------------
//  Multiplies this rational number by the one passed as a parameter.
//-----------------------------------------------------------------------------------------------------
public RationalNumber multiply(RationalNumber op2)
{
  int numer = numerator*op2.getNumerator();
  int denom = denominator*op2.getDenominator();

  return new RationalNumber(numer, denom);
}

//-------------------------------------------------------------------------------------------------------
//  Divides this rational number by the one passed as a parameter by multiplying by the reciprocal of the second rational.
//--------------------------------------------------------------------------------------------------------
  public RationalNumber divide(RationalNumber op2)
  {
     return multiply(op2.reciprocal());
}

//----------------------------------------------------------------------------------------------------------
//    Determines if this rational number is equal to the one passed as a parameter .Assumes they are  both reduced.
//----------------------------------------------------------------------------------------------------------
public boolean isLike(RationalNumber op2)
{
   return (numerator == op2.getNumerator() &&
           denominator == op2.getDenominator() );
}

//-----------------------------------------------------------------------------------------------------------
//  Returns this rational number as a string .
//-----------------------------------------------------------------------------------------------------------
  public String toString()
{
  String result;
  if (numerator == 0)
  result = "0";
else 
if (denominator == 1)
    result = numerator+"";
   else
result = numerator + "/" + denominator;
return result;
}

//--------------------------------------------------------------------------------------------------------------
//  Reduces this ratioanl number by dividing both the numerator and the denominator by their greatest common divisor.
//----------------------------------------------------------------------------------------------------------------
private void reduce()
{
  if (numerator != 0)
{
   int common = gcd(Math.abs(numerator), denominator);

   numerator = numerator = numerator / common;
   denominator = denominator / common;
}
}

//------------------------------------------------------------------------------------------------
//  Computes and returns the greatest common divisor of the two positive parameters. Uses Euclid's algorithm.
//-------------------------------------------------------------------------------------------------

private int gcd(int num1, int num2)
{
   while (num1 != num2)
       if (num1 > num2)
       num1 = num1 -num2;
       else num2 = num2 - num1;

   return num1;
}
} 
